

import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Sides;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class PrintWordTest {

    public static void main(String[] args) throws Exception {
        // 1. 遍历文件夹中的所有.docx和.doc文件
        Path startDir = Paths.get("D:\\work\\滨湖临时\\硬件部分需要盖章的资料");  // 修改为你的目录路径
        List<File> wordFiles = new ArrayList<>();
        Files.walk(startDir)
                .filter(path -> path.toString().endsWith(".docx") || path.toString().endsWith(".doc"))
                .forEach(path -> wordFiles.add(path.toFile()));

        // 2. 获取所有打印机服务
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        if (printServices.length == 0) {
            System.out.println("没有找到打印机");
            return;
        }

        // 假设我们指定了打印机的名称
        String printerName = "你的打印机名称";  // 修改为你的打印机名称
        PrintService selectedPrinter = null;
        for (PrintService printer : printServices) {
            if (printer.getName().equalsIgnoreCase(printerName)) {
                selectedPrinter = printer;
                break;
            }
        }

        if (selectedPrinter == null) {
            System.out.println("找不到指定的打印机");
            return;
        }

        // 3. 打印每个Word文件
        for (File file : wordFiles) {
            System.out.println("正在打印: " + file.getAbsolutePath());

            if (file.getName().endsWith(".docx")) {
                printDocx(file, selectedPrinter);
            } else if (file.getName().endsWith(".doc")) {
                // 如果需要处理.doc文件，可以使用JODConverter进行转换
                convertAndPrintDoc(file, selectedPrinter);
            }
        }
    }

    // 打印.docx文件
    private static void printDocx(File file, PrintService selectedPrinter) throws Exception {
        // 创建打印作业
        DocPrintJob printJob = selectedPrinter.createPrintJob();

        // 设置打印属性
        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        attributes.add(new Copies(2));  // 打印两份
        attributes.add(Sides.ONE_SIDED);  // 单面打印

        // 转换为Doc对象进行打印
        Doc doc = new SimpleDoc(new FileInputStream(file), DocFlavor.INPUT_STREAM.AUTOSENSE, null);
        // 注意，这里第三个参数改为 null，因为它是文档特定的属性
        printJob.print(doc, attributes);

    }

    // 打印.doc文件（使用JODConverter）
    private static void convertAndPrintDoc(File file, PrintService selectedPrinter) {
        // 使用JODConverter或其他方式转换.doc文件为可打印的格式（如PDF），然后进行打印
        // 暂时省略，具体可参考JODConverter文档
        System.out.println("打印.doc文件的功能暂时未实现");
    }
}
